<script setup lang="ts">
import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
import { BadgeManager } from '@/utils/badge'
import { registerPushDevice, type DeviceInfo } from '@/Api/document'
import { UserManager } from '@/utils/user'
import envConfig from '@/config/env'
import { checkAppUpdate } from '@/utils/update'

// #ifdef APP-PLUS
// 🔥 请求通知权限（Android 13+必须）
function requestNotificationPermission() {
  try {
    console.log('[权限] 开始请求通知权限')
    // @ts-ignore
    const Build = plus.android.importClass('android.os.Build')
    // @ts-ignore
    const sdkInt = Build.VERSION.SDK_INT
    console.log('[权限] Android SDK版本:', sdkInt)

    // Android 13+ (API 33+) 必须动态申请通知权限
    if (sdkInt >= 33) {
      console.log('[权限] Android 13+，申请通知权限 POST_NOTIFICATIONS')

      // @ts-ignore
      plus.android.requestPermissions(
        ['android.permission.POST_NOTIFICATIONS'],
        (result: any) => {
          console.log('[权限] 通知权限申请结果:', result)
          if (result.granted && result.granted.length > 0) {
            console.log('[权限] ✅ 通知权限已授予')
          } else if (result.deniedAlways && result.deniedAlways.length > 0) {
            console.warn('[权限] ⚠️ 通知权限被永久拒绝')
            uni.showModal({
              title: '需要通知权限',
              content: '请在系统设置中开启通知权限，否则无法接收推送消息',
              confirmText: '去设置',
              success: (modalRes) => {
                if (modalRes.confirm) {
                  // 跳转到应用设置页面
                  // @ts-ignore
                  const Intent = plus.android.importClass('android.content.Intent')
                  // @ts-ignore
                  const Settings = plus.android.importClass('android.provider.Settings')
                  // @ts-ignore
                  const main = plus.android.runtimeMainActivity()
                  // @ts-ignore
                  const intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
                  // @ts-ignore
                  intent.putExtra('android.provider.extra.APP_PACKAGE', main.getPackageName())
                  // @ts-ignore
                  main.startActivity(intent)
                }
              },
            })
          }
        },
        (error: any) => {
          console.error('[权限] ❌ 通知权限申请失败:', error)
        },
      )
    } else {
      console.log('[权限] Android 13以下，无需动态申请通知权限')
      // Android 12及以下，通知权限通过manifest自动获取
    }
  } catch (error) {
    console.error('[权限] ❌ 请求通知权限异常:', error)
  }
}

// 请求存储权限
function requestStoragePermission() {
  try {
    console.log('[权限] 开始请求存储权限')
    // @ts-ignore
    const Build = plus.android.importClass('android.os.Build')
    // @ts-ignore
    const sdkInt = Build.VERSION.SDK_INT
    console.log('[权限] Android SDK版本:', sdkInt)

    let permissions: string[] = []

    // Android 13+ (API 33+)
    if (sdkInt >= 33) {
      permissions = [
        'android.permission.READ_MEDIA_IMAGES',
        'android.permission.READ_MEDIA_VIDEO',
        'android.permission.READ_MEDIA_AUDIO',
      ]
      console.log('[权限] Android 13+，申请媒体权限')
    }
    // Android 11-12 (API 30-32)
    else if (sdkInt >= 30) {
      permissions = [
        'android.permission.READ_EXTERNAL_STORAGE',
        'android.permission.WRITE_EXTERNAL_STORAGE',
      ]
      console.log('[权限] Android 11-12，申请存储权限')
    }
    // Android 6-10 (API 23-29)
    else if (sdkInt >= 23) {
      permissions = [
        'android.permission.READ_EXTERNAL_STORAGE',
        'android.permission.WRITE_EXTERNAL_STORAGE',
      ]
      console.log('[权限] Android 6-10，申请存储权限')
    } else {
      console.log('[权限] Android 6以下，无需动态申请权限')
      return
    }

    // 使用plus.android.requestPermissions申请权限
    // @ts-ignore
    plus.android.requestPermissions(
      permissions,
      (result: any) => {
        console.log('[权限] 权限申请结果:', result)
        if (result.granted && result.granted.length > 0) {
          console.log('[权限] ✅ 已授予权限:', result.granted)
        }
        if (result.deniedAlways && result.deniedAlways.length > 0) {
          console.warn('[权限] ⚠️ 永久拒绝的权限:', result.deniedAlways)
          uni.showModal({
            title: '需要存储权限',
            content: '请在系统设置中开启存储权限，否则无法选择和上传文件',
            confirmText: '去设置',
            success: (modalRes) => {
              if (modalRes.confirm) {
                // 跳转到应用设置页面
                // @ts-ignore
                const Intent = plus.android.importClass('android.content.Intent')
                // @ts-ignore
                const Settings = plus.android.importClass('android.provider.Settings')
                // @ts-ignore
                const Uri = plus.android.importClass('android.net.Uri')
                // @ts-ignore
                const main = plus.android.runtimeMainActivity()
                // @ts-ignore
                const intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                // @ts-ignore
                const uri = Uri.fromParts('package', main.getPackageName(), null)
                // @ts-ignore
                intent.setData(uri)
                // @ts-ignore
                main.startActivity(intent)
              }
            },
          })
        }
      },
      (error: any) => {
        console.error('[权限] ❌ 权限申请失败:', error)
      },
    )
  } catch (error) {
    console.error('[权限] ❌ 请求权限异常:', error)
  }
}
// #endif

// 注册推送设备到后端（简化逻辑）
const registerDevice = async () => {
  // #ifdef APP-PLUS
  try {
    console.log('[App] ========== 开始设备注册/更新流程 ==========')

    // 1. 检查用户是否已登录
    const token = uni.getStorageSync('token')
    if (!token) {
      console.log('[App] ❌ Token不存在，用户未登录，跳过设备注册')
      return
    }
    console.log('[App] ✅ Token存在，用户已登录')

    // 2. 获取用户信息（使用 UserManager）
    const userInfo = UserManager.getFullUserInfo()

    if (!userInfo || !userInfo.id) {
      console.warn('[App] ❌ 用户信息不存在，尝试重新加载...')

      // 尝试重新加载用户信息
      await UserManager.ensureUserInfo()

      const retryUserInfo = UserManager.getFullUserInfo()
      if (!retryUserInfo || !retryUserInfo.id) {
        console.warn('[App] ❌ 用户信息仍然为空，跳过设备注册')
        return
      }
      console.log('[App] ✅ 重新加载成功, userId:', retryUserInfo.id)
    } else {
      console.log('[App] ✅ 用户信息存在, userId:', userInfo.id)
    }

    // 3. 获取ClientID
    const clientId = await BadgeManager.getClientId()
    if (!clientId || clientId === 'unknown') {
      console.warn('[App] ❌ 无法获取ClientID，跳过设备注册')
      return
    }
    console.log('[App] ✅ ClientID获取成功:', clientId)

    // 4. 获取设备信息
    const systemInfo = uni.getSystemInfoSync()
    const deviceInfo: DeviceInfo = {
      clientId: clientId,
      platform: systemInfo.platform, // ios 或 android
      deviceModel: systemInfo.model,
      systemVersion: systemInfo.system,
      appVersion: envConfig.version,
    }

    console.log('[App] 📤 调用注册接口，设备信息:', deviceInfo)
    console.log('[App] 📌 后端会自动判断：设备已存在→更新，设备不存在→插入')

    // 5. 直接调用注册接口（后端会自动判断插入或更新）
    const response = await registerPushDevice(deviceInfo)

    console.log('[App] 📥 注册接口响应:', response)

    if (response.code === 200) {
      console.log('[App] ✅✅✅ 设备注册/更新成功！')
    } else {
      console.warn('[App] ❌ 设备注册/更新失败:', response.message)
    }
  } catch (error) {
    console.error('[App] ❌❌❌ 设备注册/更新异常:', error)
    // 注册失败不影响App正常使用
  }
  // #endif
}

// 处理推送消息点击事件
const handlePushMessage = (message: any) => {
  console.log('[App] 收到推送消息:', message)

  try {
    // 解析payload
    const payload =
      typeof message.payload === 'string' ? JSON.parse(message.payload) : message.payload

    // 🔥 点击通知后统一跳转到首页，让用户在首页查看待办事项
    // 不再跳转到详情页，避免打断用户当前操作流程
    uni.switchTab({
      url: '/pages/index/index',
    })
  } catch (e) {
    console.error('[App] 处理推送消息失败:', e)
    // 默认跳转到首页
    uni.switchTab({
      url: '/pages/index/index',
    })
  }
}

onLaunch(async () => {
  console.log('App Launch')

  // 隐藏原生TabBar，使用自定义TabBar（App端和H5端都需要）
  uni.hideTabBar({
    animation: false,
    success: () => {
      console.log('原生TabBar已隐藏')
    },
    fail: (err) => {
      console.log('隐藏TabBar失败:', err)
    },
  })
  uni.getPushClientId({
    success: (res) => {
      let push_clientid = res.cid
      console.log('客户端推送标识cid:', push_clientid)
    },
    fail(err) {
      console.log(err)
    },
  })
  // #ifdef APP-PLUS
  // 🔥 优先请求通知权限（必须，否则无法接收离线推送）
  setTimeout(() => {
    requestNotificationPermission()
  }, 300)

  // 请求存储权限（必须，否则无法访问文件）
  setTimeout(() => {
    requestStoragePermission()
  }, 800)

  // 检查应用版本更新
  setTimeout(() => {
    checkAppUpdate().catch((error) => {
      console.error('[App] 检查更新失败:', error)
    })
  }, 1500)
  // #endif

  // #ifdef APP-PLUS
  // 监听推送消息点击事件
  plus.push.addEventListener(
    'click',
    (message) => {
      console.log('[App] 用户点击推送消息:', message)
      handlePushMessage(message)
    },
    false,
  )

  // 监听推送消息到达事件（App在前台时）
  plus.push.addEventListener(
    'receive',
    (message) => {
      console.log('[App] App前台收到推送消息:', message)

      // 🔥 App在前台时，创建本地通知显示给用户
      try {
        // @ts-ignore
        const title = (message as any).title || '新消息'
        // @ts-ignore
        const content = (message as any).content || '您有新的待办事项'

        // 方式1：使用plus.push创建本地通知
        // @ts-ignore
        plus.push.createMessage(
          content,
          '', // JSON payload
          {
            title: title,
            cover: false, // 不覆盖之前的通知
            sound: 'system', // 使用系统提示音
            // @ts-ignore
            vibrate: true, // 震动
          },
        )

        console.log('[App] ✅ 已创建本地通知:', title)

        // 方式2：同时使用uni.showToast提示（可选）
        uni.showToast({
          title: title,
          icon: 'none',
          duration: 3000,
        })

        // 刷新角标（如果有待办数量）- 暂时注释，BadgeManager没有refreshBadge方法
        // BadgeManager.refreshBadge()
      } catch (error) {
        console.error('[App] 创建本地通知失败:', error)
      }
    },
    false,
  )

  // 监听用户登录成功事件（由登录页触发）
  uni.$on('user-logged-in', () => {
    console.log('[App] 收到登录成功事件，立即注册设备')
    // 延迟1秒，确保用户信息已保存
    setTimeout(() => {
      registerDevice()
    }, 1000)
  })
  // #endif
})

onShow(() => {
  console.log('App Show')

  // #ifdef APP-PLUS
  // App从后台恢复时，如果用户已登录，尝试注册/更新设备
  // 注意：主要的注册时机是登录成功事件，这里是补充机制
  setTimeout(() => {
    const token = uni.getStorageSync('token')
    if (token) {
      console.log('[App] onShow检测到用户已登录，尝试更新设备')
      registerDevice()
    }
  }, 1000)
  // #endif
})

onShow(() => {
  // #ifdef APP-PLUS
  console.log('[App] onShow -> trigger update check')
  checkAppUpdate().catch((error) => {
    console.error('[App] 检查更新失败(onShow):', error)
  })
  // #endif
})

onHide(() => {
  console.log('App Hide')
})
</script>

<style lang="scss">
/* 全局样式 */
view,
text,
image,
input,
button,
scroll-view,
swiper,
swiper-item {
  box-sizing: border-box;
}

page {
  background-color: #f5f5f5;
}
</style>
